/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mindbox.mueblesalpes.negocio.compras;

import com.mindbox.mueblesalpes.negocio.entity.CategoriaValor;
import com.mindbox.mueblesalpes.negocio.entity.Cliente;
import com.mindbox.mueblesalpes.negocio.entity.Compra;
import com.mindbox.mueblesalpes.negocio.entity.Mueble;
import com.mindbox.mueblesalpes.negocio.entity.Usuario;
import com.mindbox.mueblesalpes.negocio.entity.Venta;
import static com.mindbox.mueblesalpes.negocio.utilidades.UtilidadesCompra.*;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.Stateful;

/**
 *
 * @author jsanchez
 */
@Stateful
public class CarritoComprasBean implements CarritoComprasLocal {

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method" or "Web Service > Add Operation")
    /**
     * Mueble seleccionado actualmente.
     */
    private Mueble muebleSeleccionado;
    /**
     * Carrito de compras.
     */
    private List<Compra> carritoCompras;
    /**
     * Representa a la venta que se va a realizar en el momento.
     */
    private Venta venta;
    /**
     * Categorias de valor de la compra
     */
    private List<CategoriaValor> categoriasValor;
    private double subtotal;
    private double valorTotal;
    private String descripcionVenta;

    public CarritoComprasBean() {
    }

    @PostConstruct
    public void init() {
        this.carritoCompras = new ArrayList<Compra>();
        this.categoriasValor = new ArrayList<CategoriaValor>();
        this.setValorTotal(0.0);
        this.setSubtotal(0.0);
        this.setMuebleSeleccionado(null);
        this.setVenta(null);
        this.setDescripcionVenta(null);
    }

    @Override
    public Mueble getMuebleSeleccionado() {
        return muebleSeleccionado;
    }

    @Override
    public void setMuebleSeleccionado(Mueble muebleSeleccionado) {
        this.muebleSeleccionado = muebleSeleccionado;
    }

    @Override
    public List<Compra> getCarritoCompras() {
        return carritoCompras;
    }

    @Override
    public void setCarritoCompras(List<Compra> carritoCompras) {
        this.carritoCompras = carritoCompras;
    }

    @Override
    public Venta getVenta() {
        return this.venta;
    }

    @Override
    public void setVenta(Venta venta) {
        this.venta = venta;
    }

    @Override
    public void setCategoriasValor(List<CategoriaValor> categoriasValor) {
        this.categoriasValor = categoriasValor;
    }

    @Override
    public List<CategoriaValor> getCategoriasValor() {
        return this.categoriasValor;
    }

    @Override
    public double getSubtotal() {
        return subtotal;
    }

    @Override
    public void setSubtotal(double subtotal) {
        this.subtotal = subtotal;
    }

    @Override
    public double getValorTotal() {
        return valorTotal;
    }

    @Override
    public void setValorTotal(double valorTotal) {
        this.valorTotal = valorTotal;
    }

    @Override
    public String getDescripcionVenta() {
        return descripcionVenta;
    }

    @Override
    public void setDescripcionVenta(String descripcionVenta) {
        this.descripcionVenta = descripcionVenta;
    }

    @Override
    public void validarAgregarMuebleSeleccionado() {
        // Se verifica si se debe agregar un producto al carrito
        if (this.getMuebleSeleccionado() != null) {
            int index = this.getCarritoCompras().indexOf(new Compra(this.getMuebleSeleccionado(), 0, 0.0));
            if (index < 0) {
                //Se debe agregar al carrito.
                this.getCarritoCompras().add(new Compra(this.getMuebleSeleccionado(), 1,
                        calcularPrecioInventarioMueble(this.getMuebleSeleccionado()).getPrecio()));
            } else {
                // Se debe actualizar la catnidad de la compra
                Compra compra = this.getCarritoCompras().get(index);
                compra.setCantidad(compra.getCantidad() + 1);
            }
            // Se coloca el mueble seleccionado en null para no volverlo a adicionar
            setMuebleSeleccionado(null);
            // Se debe calcular todos los valores:
            this.setSubtotal(calcularSubtotalCompra(this.getCarritoCompras()));
            this.setCategoriasValor(calcularValorCategoriasCompra(this.getSubtotal()));
            this.setValorTotal(calcularValorTotalCompra(this.getCategoriasValor()));
        }
    }

    @Override
    public void realizarVenta(Cliente cliente, Usuario usuario) {
        venta = new Venta();
        venta.setReferencia("RP-" + (int) (Math.random() * 25));
        venta.setCategoriasValor(this.getCategoriasValor());
        venta.setCliente(cliente);
        venta.setCompras(this.getCarritoCompras());
        venta.setUsuario(usuario);
        venta.setValorTotal(this.getValorTotal());
        this.setVenta(venta);
        this.setDescripcionVenta(calcularDescripcionVenta(this.getVenta()));
    }

    @Override
    public void realizarPago() {
        //TODO disminuir del inventario
        enviarCorreo("mindbox09@gmail.com", "Compra de Productos", "Su compra ha sido exitosa:" + getDescripcionVenta());
    }

    @Override
    public void cancelarPago() {
        terminarTransaccion();
    }

    @Override
    public void terminarTransaccion(){
        this.init();
    }
}